package br.com.cfccultura.admin.model.dao.mysql;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import br.com.cfccultura.admin.model.dao.ICalendarioDAO;
import br.com.cfccultura.admin.model.enums.DiaSemana;
import br.com.cfccultura.admin.model.enums.SimNao;
import br.com.cfccultura.admin.model.vo.CalendarioDia;

@Repository
public class CalendarioDAO extends DAO implements ICalendarioDAO {

	@Override
	public List<CalendarioDia> consultar(CalendarioDia vo) {

		String sql = "SELECT cd_calendario, dc_calendario, dt_calendario, id_feriado, id_dia_semana FROM tb_calendario where 1=1 ";
		Object[] params = {};
		if(vo.getCodigo() != null) {
			sql += "and cd_calendario = ? ";
			params = new Object[]{vo.getCodigo()};
		} else if(vo.getData() != null){
			sql += "and dt_calendario = ? ";
			params = new Object[]{vo.getData()};
		}
		sql += "order by dt_calendario";

		try {		
			return query(sql, params, new RowMapper<CalendarioDia>() {
				@Override
				public CalendarioDia mapRow(ResultSet rs, int arg1) throws SQLException {
					CalendarioDia vo = new CalendarioDia();
					vo.setCodigo(rs.getInt("cd_calendario"));
					vo.setDescricao(rs.getString("dc_calendario"));
					vo.setData(rs.getDate("dt_calendario"));
					vo.setFeriado(SimNao.setValue(rs.getInt("id_feriado")));
					vo.setDiaSemana(DiaSemana.setValue(rs.getInt("id_dia_semana")));				
					return vo;
				}			
			});
		
		} catch(EmptyResultDataAccessException e) {
			return new ArrayList<CalendarioDia>();
		}
	}
	
	@Override
	public CalendarioDia consultar(Integer codigo) {
		List<CalendarioDia> resultado = consultar(new CalendarioDia(codigo));
		if(resultado.size() > 0) {
			return resultado.get(0);
		}
		return null;
	}
	
	@Override
	public CalendarioDia consultar(Date data) {
		List<CalendarioDia> resultado = consultar(new CalendarioDia(data));
		if(resultado.size() > 0) {
			return resultado.get(0);
		}
		return null;
	}
	
	@Override
	public void incluir(CalendarioDia vo) {
		String sql = "INSERT INTO tb_calendario(dc_calendario, dt_calendario, id_feriado, id_dia_semana) values(?,?,?,?)";
		update(sql, new Object[] {vo.getDescricao(), vo.getData(), vo.getFeriado().getValue(), vo.getDiaSemana().getValue()});
	}
	
	@Override
	public void alterar(CalendarioDia vo) {
		String sql = "UPDATE tb_calendario set dc_calendario = ?, dt_calendario = ?, id_feriado = ?, id_dia_semana = ? where cd_calendario = ?";
		update(sql, new Object[] {vo.getDescricao(), vo.getData(), vo.getFeriado().getValue(), vo.getDiaSemana().getValue(), vo.getCodigo()});
	}
	
	@Override
	public void excluir(Integer id) {
		try {
			String sql = "DELETE FROM tb_calendario where cd_calendario = ?";
			update(sql, new Object[] {id});
		} catch(DataIntegrityViolationException e) {
			String sql = "UPDATE tb_calendario set id_feriado = 0 where cd_calendario = ?";
			update(sql, new Object[] {id});
		}
	}

}
